package com.cs.paoyer.common.exception;

//import java.util.Collection;
//import java.util.Vector;

/**
 * Representan el conjunto de errores de tipo sistema para el m�dulo common
 * de la aplicaci�n.
 */
public class CommonSystemException implements ModuleExceptionInterface {

    /**
     * Informaci�n del m�dulo al que pertenece el error.
     */
    private static final int COMMON_MODULE = 9;

    /**
     * Representa un error que indica que el tipo de Excepcion Lanzada
     * no existe
     */
    public static final int TYPE_EXCEPTION_NOT_FOUND =
        COMMON_MODULE * SYSTEM_EXCEPTION + 1;

    /**
     * Representa un error que indica que un modulo de la Excepcion lanzada,
     * no pudo encontrarse desde ModuleExceptionFactory
     */
    public static final int MODULE_EXCEPTION_NOT_FOUND =
        COMMON_MODULE * SYSTEM_EXCEPTION + 2;

    /**
     * Representa un error que indica que un modulo de la Excepcion lanzada,
     * no pudo ser creado
     */
    public static final int MODULE_EXCEPTION_NOT_CREATED =
        COMMON_MODULE * SYSTEM_EXCEPTION + 3;

    /**
     * Ocurrio un Error al Hacer casting en el ModuleExceptionFactory.
     * El nombre de Clase que se paso no implementa la interfaz ModuleExceptionInterface
     */
    public static final int CLASS_CAST_MODULE_EXCEPTION =
        COMMON_MODULE * SYSTEM_EXCEPTION + 4;

    /**
     * Representa un error que indica que un Identificador de Excepcion no esta definido
     * en la Clase que implementa la interfaz ModuleExceptionInterface
     */
    public static final int IDENTIFY_EXCEPTION_NOT_FOUND =
        COMMON_MODULE * SYSTEM_EXCEPTION + 5;

    /**
     * Representa un error que indica que una propiedad del archivo de propiedades
     * no se encuentra registrada.
     */
    public static final int PROPERTY_NOT_FOUND =
        COMMON_MODULE * SYSTEM_EXCEPTION + 6;

    /**
         * Representa un error que indica que una propiedad del archivo de propiedades
     * fue almacenada sin un valor asociado.
     */
    public static final int PROPERTY_IS_NULL =
        COMMON_MODULE * SYSTEM_EXCEPTION + 7;

    /**
     * Representa un error que indica que no se obtuvo una conexion JDBC del DataSource.
     */
    public static final int JDBC_CONNECTION_IS_NULL =
        COMMON_MODULE * SYSTEM_EXCEPTION + 8;

    /**
     * Representa un error en la ejecucion de una consulta SQL.
     */
    public static final int QUERY_EXCEPTION =
        COMMON_MODULE * SYSTEM_EXCEPTION + 9;

    /**
     * Error al cerrar la conexion JDBC.
     */
    public static final int JDBC_CLOSE_EXCEPTION =
        COMMON_MODULE * SYSTEM_EXCEPTION + 10;

    /**
     * Representa un error inesperado.
     */
    public static final int JAVA_EXCEPTION_OCCURRED =
        COMMON_MODULE * SYSTEM_EXCEPTION + 11;

    /**
     * Representa un error cuando se intenta leer el archivo de propiedades.
     */
    public static final int ERROR_READING_PROPERTIES_FILE =
        COMMON_MODULE * SYSTEM_EXCEPTION + 12;

    /**
     * Representa un error cuando se intenta trabajar con fechas.
     */
    public static final int DATE_PARSE_EXCEPTION =
        COMMON_MODULE * SYSTEM_EXCEPTION + 13;

  /**
   * No se pudo encontrar el data source configurado
   */
    public static final int CANNOT_FIND_DATASOURCE = 
        COMMON_MODULE * SYSTEM_EXCEPTION + 14;

    /**
     * Devuelve el ExceptionVO dependiendo el Id del mensaje
     * @param messageId int Identificador del Mensaje.
     * Este Mensaje tiene que estar Definido como constante.
     * @throws SystemException
     * @return ExceptionVO
     */
    public ExceptionVO getExceptionVO(int exceptionId) throws ExceptionIdNotFound {

        switch (exceptionId) {

          case TYPE_EXCEPTION_NOT_FOUND:
            return new ExceptionVO(this.TYPE_EXCEPTION_NOT_FOUND,
                                   this.COMMON_MODULE,
                                   "Tipo de Excepcion No Registrda.",
              "Revise en la Interface ModuleExceptionInterface y verifique " +
              "que exista una constante definida para el tipo de Excepcion");

          case MODULE_EXCEPTION_NOT_FOUND:
            return new ExceptionVO(this.MODULE_EXCEPTION_NOT_FOUND,
                                   this.COMMON_MODULE,
              "Clase no Encontrada en el Sistema de Excepciones.",
              "Revise la Clase definida y verifique que el nombre " +
              "de la Clase se encuentre escrita correctamente ");

          case MODULE_EXCEPTION_NOT_CREATED:
            return new ExceptionVO(this.MODULE_EXCEPTION_NOT_CREATED,
                                   this.COMMON_MODULE,
              "Clase del Modulo no pudo ser creada en el Sistema de Excepciones.",
              "Verifique que la Clase se encuentre bien compilada " +
              "o verifique sus permisos de creaci�n ");

          case CLASS_CAST_MODULE_EXCEPTION:
            return new ExceptionVO(this.CLASS_CAST_MODULE_EXCEPTION,
                                   this.COMMON_MODULE,
              "Ocurrio un Error al Hacer Casting en ModuleExceptionFactory.",
              "Asegurese que la Clase Exception del modulo " +
              "implemente la interfaz ModuleExceptionInterface");

          case IDENTIFY_EXCEPTION_NOT_FOUND:
            return new ExceptionVO(this.IDENTIFY_EXCEPTION_NOT_FOUND,
                                   this.COMMON_MODULE,
                                   "Identificador de Excepcion No Registrado.",
              "Revise en la Clase de ModuleExcepcion que implementa ModuleExceptionInterface " +
              "que exista una constante definida para identificar la Excepcion");

          case PROPERTY_NOT_FOUND:
            return new ExceptionVO(this.PROPERTY_NOT_FOUND,
                                   this.COMMON_MODULE,
                                   "Propiedad de SAAW no encontrada.",
                                   "Revise el archivo de propiedades de SAAW y verifique que el nombre y el valor de la propiedad esten incluidos.");

          case PROPERTY_IS_NULL:
            return new ExceptionVO(this.PROPERTY_IS_NULL,
                                   this.COMMON_MODULE,
                                   "Nombre de Propiedad no puede ser NULL.",
              "El nombre de la propiedad enviado es null; revise el nombre de la propiedad.");

          case JDBC_CONNECTION_IS_NULL:
            return new ExceptionVO(this.JDBC_CONNECTION_IS_NULL,
                                   this.COMMON_MODULE,
                                   "Conexion JDBC del DataSource es NULL.",
              "Ocurrio un error obteniendo una conexion JDBC del DataSource." +
              "Verifique que los parametros del data source sean correctos y " +
              "que la base de datos y el listener esten funcionando correctamente.");
          case QUERY_EXCEPTION:
            return new ExceptionVO(this.QUERY_EXCEPTION,
                                   this.COMMON_MODULE,
                                   "Error ejecutando consulta SQL.",
              "Ocurrio un error cuando se ejecuto una consulta SQL." +
              "Verifique que los datos enviados a la consulta sean validos o la version del esquema de base de datos.");

          case JDBC_CLOSE_EXCEPTION:
            return new ExceptionVO(this.JDBC_CLOSE_EXCEPTION,
                                   this.COMMON_MODULE,
              "Error cerrando conexion JDBC a la base de datos.",
              "Ocurrio un error cuando se intento cerrar una conexion JDBC a la base de datos." +
              "Si el problema persiste, consulte con el administrador.");

          case JAVA_EXCEPTION_OCCURRED:
            return new ExceptionVO(this.JAVA_EXCEPTION_OCCURRED,
                                   this.COMMON_MODULE,
                                   "Ocurri� un error inesperado.",
              "El sistema arroj� un error inesperado. Consulte el trazo del error" +
              "para mayor informaci�n.");

          case ERROR_READING_PROPERTIES_FILE:
            return new ExceptionVO(this.ERROR_READING_PROPERTIES_FILE,
                                   this.COMMON_MODULE,
                                   "Ocurri� un error al intentar leer el archivo" +
                                   " de propiedades.",
              "Puede ser que el archivo no se encuentre donde deber�a estar.");

          case DATE_PARSE_EXCEPTION:
            return new ExceptionVO(this.DATE_PARSE_EXCEPTION,
                                   this.COMMON_MODULE,
                                   "Ocurri� un error al intentar trabajar con las fechas.",
              "El sistema est� intentando trabajar erroneamente con una fecha. Alg�n valor" +
              "que no se puede traducir a una fecha est� siendo ingresado en el sistema.");
          case CANNOT_FIND_DATASOURCE:
            return new ExceptionVO(this.CANNOT_FIND_DATASOURCE, this.COMMON_MODULE, 
              "No se pudo encontrar el nombre del data source", 
              "No se pudo encontrar el nombre del data source");

          default:
            throw new ExceptionIdNotFound(exceptionId);
        }
    }

    /**
         * Obtiene un objeto <code>ModuleVO</code> que contiene el nombre del modulo
     * y la clase que maneja las excepciones.
     *
     * @return Objeto <code>ModuleVO</code> que contiene el nombre del modulo
     * y la clase que maneja las excepciones.
     */
    public ModuleVO getModuleVO() {

        return new ModuleVO("COMMON", this.getClass().getName());
    }

}